package br.com.swp.campestre.session;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.validator.Length;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.persistence.HibernateSessionProxy;

import br.com.swp.campestre.entity.ClientePF;
import br.com.swp.campestre.entity.ClientePJ;
import br.com.swp.campestre.entity.Lote;
import br.com.swp.campestre.entity.ParcelaFinancimentoCEF;
import br.com.swp.campestre.entity.ParcelaFinancimentoProprio;
import br.com.swp.campestre.entity.Venda;
import br.com.swp.campestre.enumeration.SimNao;
import br.com.swp.campestre.enumeration.StatusParcela;

@Stateful
@Name("ConsultaVenda")
public class ConsultaVendaBean implements ConsultaVenda
{
    @Logger private Log log;

    @In StatusMessages statusMessages;
    
	@PersistenceContext
	private EntityManager entityManager;

	@In(create = true, required = false)
	private HibernateSessionProxy hibernateSession;
	
	@In( required = false , value="AjustaParcelaCEF")//, scope=ScopeType.CONVERSATION)
	private AjustaParcelaCEF ajustaParcelaCEF;
	
	@In(required=false , value="QuitaParcelaCEF")
	private QuitaParcelaCEF quitaParcelaCEF;
	
	
	//@Out(required=false,scope=ScopeType.CONVERSATION)
	private Venda venda;
	
	@RequestParameter
	private Long idVenda;


    private String value;
    
    private List<Venda> vendas;
    
    //Campos para filtro
    private String cpf;
    private String cnpj;
    private String nome;
    private String codLote;

    @Begin(join=true)
    public void consultaVenda(){

        List<Venda> _vendas = null;
		vendas = new ArrayList<Venda>(0);
		boolean filtroInformado = false;

		Criteria crt = hibernateSession.createCriteria(Venda.class);

		if (cpf != null && !cpf.equals("")) {
			filtroInformado = true;
			Criteria crtClientes = crt.createCriteria("clientesPF");
			crtClientes.add(Restrictions.eq("cpf", cpf));
		}
		if (filtroInformado) {
			vendas = crt.list();
		}
		
		if (codLote != null && !codLote.equals("")) {
			filtroInformado = true;
			crt = hibernateSession.createCriteria(Venda.class);
			Criteria crtClientes = crt.createCriteria("lotes");
			crtClientes.add(  Restrictions.like("codigoLote", codLote, MatchMode.ANYWHERE).ignoreCase());
			
			_vendas = crt.list();
			if(_vendas != null && !_vendas.isEmpty()){
				vendas.addAll(_vendas);
			}
		}
		
		if (nome != null && !nome.equals("")) {
			filtroInformado = true;
			crt = hibernateSession.createCriteria(Venda.class);
			Criteria crtClientes = crt.createCriteria("clientesPF");
			crtClientes.add(  Restrictions.like("nome", nome, MatchMode.ANYWHERE).ignoreCase());
			
			_vendas = crt.list();
			if(_vendas != null && !_vendas.isEmpty()){
				vendas.addAll(_vendas);
			}
		}
		
		if (nome != null && !nome.equals("")) {
			filtroInformado = true;
			crt = hibernateSession.createCriteria(Venda.class);
			Criteria crtClientes = crt.createCriteria("clientesPJ");
			//crtClientes.add(Restrictions.disjunction().  .like("razaoSocial", nome, MatchMode.ANYWHERE).ignoreCase());
			//crtClientes.add(Restrictions.like("razaoSocial", nome, MatchMode.ANYWHERE).ignoreCase());
			crtClientes.add(Restrictions.like("nomeFantasia", nome, MatchMode.ANYWHERE).ignoreCase());

			_vendas = crt.list();
			if(_vendas != null && !_vendas.isEmpty()){
				vendas.addAll(_vendas);
			}
		}
		
		if (cnpj != null && !cnpj.equals("")) {
			filtroInformado = true;
			crt = hibernateSession.createCriteria(Venda.class);
			Criteria crtClientes = crt.createCriteria("clientesPJ");
			//crtClientes.add(Restrictions.disjunction().  .like("razaoSocial", nome, MatchMode.ANYWHERE).ignoreCase());
			//crtClientes.add(Restrictions.like("razaoSocial", nome, MatchMode.ANYWHERE).ignoreCase());
			crtClientes.add(Restrictions.eq("cnpj", cnpj));
			
			_vendas = crt.list();
			if(_vendas != null && !_vendas.isEmpty()){
				vendas.addAll(_vendas);
			}
			
			
		}
		
		//Remove duplicadas
		if( vendas != null && !vendas.isEmpty()){
			if( _vendas != null && !_vendas.isEmpty()){
				_vendas.clear();
			} else {
				_vendas = new ArrayList<Venda>();
			}
			for (Venda _v : vendas) {
				if(!_vendas.contains(_v)){
					_vendas.add(_v);
				}
			}
			vendas.clear();
			vendas.addAll(_vendas);
		}

		if (vendas == null || vendas.isEmpty()) {
			statusMessages.add("Venda nao encontrada");
		}

    	
    }
    
    public void buscaVenda(){
    	
    	if(idVenda == null)return;
    	//venda = entityManager.find(Venda.class, idVenda);
    	
    	for (Venda _venda : vendas) {
			if(_venda.getId().equals(idVenda)){
				venda = _venda;
				break;
			}
		}
    	parcelasFinancimentoCEF = venda.getParcelasFinancimentoCEF();
    	Collections.sort(parcelasFinancimentoCEF);
    	
//    	List<ClientePF> clientesPF = venda.getClientesPF();
//    	for (ClientePF clientePF : clientesPF) {
//			log.info(clientePF);
//		}
//    	
//    	List<ClientePJ> clientesPJ = venda.getClientesPJ();
//    	for (ClientePJ clientePJ : clientesPJ) {
//    		log.info(clientePJ);
//    	}
//    	
//    	venda.getComprador();
//    	List<ParcelaFinancimentoProprio> parcelasFinancimentoProprio = venda.getParcelasFinancimentoProprio();
//    	for (ParcelaFinancimentoProprio parcelaFinancimentoProprio : parcelasFinancimentoProprio) {
//			log.info(parcelaFinancimentoProprio);
//		}
//    	
//    	List<ParcelaFinancimentoCEF> parcelasFinancimentoCEF = venda.getParcelasFinancimentoCEF();
//		if(parcelasFinancimentoCEF != null && !parcelasFinancimentoCEF.isEmpty() && parcelasFinancimentoCEF.size() > 1){
//			Collections.sort(parcelasFinancimentoCEF);
//		}
//
//    	for (ParcelaFinancimentoCEF parcelaFinancimentoCEF : parcelasFinancimentoCEF) {
//			log.info(parcelaFinancimentoCEF);
//		}
//    	
//    	List<Lote> lotes = venda.getLotes();
//    	for (Lote lote : lotes) {
//			log.info(lote);
//		}
    }
    
    public List<ParcelaFinancimentoCEF> parcelasFinancimentoCEF;
    public ParcelaFinancimentoCEF parcelaFinancimentoCEFSelecionada;
    public Integer numeroParcela;
    public BigDecimal novoValor;
    public Boolean atualizarPosteriores = Boolean.FALSE;
    
    public void ajustaValorParcelas(){
    	try {
    		numeroParcela = parcelaFinancimentoCEFSelecionada.getParcela()-1;
    		//venda = entityManager.merge(venda);
    		ajustaParcelaCEF.ajustaValorParcelas(venda, numeroParcela, novoValor, atualizarPosteriores);
    		parcelasFinancimentoCEF = venda.getParcelasFinancimentoCEF();
        	Collections.sort(parcelasFinancimentoCEF);
    		numeroParcela = null;
    		novoValor = null;
    		
		} catch (Exception e) {
			e.printStackTrace();
			statusMessages.add(e.getMessage());
		}
    	
    }
    
    public void quitaParcelaCEF(){
    	
    	try {
    		quitaParcelaCEF.quitar(parcelaFinancimentoCEFSelecionada);
    		boolean parcelaPendenteCEF = quitaParcelaCEF.existeParcelaPendente(venda);
    		log.info("Existe parcela CEF pendente? " + parcelaPendenteCEF);
		} catch (Exception e) {
			e.printStackTrace();
			statusMessages.add(e.getMessage());
		}
    	
    }
    
    
    
    // add additional action methods

    @Length(max = 10)
    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {
        this.value = value;
    }

    @Destroy
    @Remove
    public void destroy() {}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public List<Venda> getVendas() {
		return vendas;
	}

	public void setVendas(List<Venda> vendas) {
		this.vendas = vendas;
	}

	public Venda getVenda() {
		return venda;
	}

	public void setVenda(Venda venda) {
		this.venda = venda;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCodLote() {
		return codLote;
	}

	public void setCodLote(String codLote) {
		this.codLote = codLote;
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}


	public Integer getNumeroParcela() {
		return numeroParcela;
	}

	public void setNumeroParcela(Integer numeroParcela) {
		this.numeroParcela = numeroParcela;
	}

	public BigDecimal getNovoValor() {
		return novoValor;
	}

	public void setNovoValor(BigDecimal novoValor) {
		this.novoValor = novoValor;
	}

	public Boolean getAtualizarPosteriores() {
		return atualizarPosteriores;
	}

	public void setAtualizarPosteriores(Boolean atualizarPosteriores) {
		this.atualizarPosteriores = atualizarPosteriores;
	}

	public AjustaParcelaCEF getAjustaParcelaCEF() {
		return ajustaParcelaCEF;
	}

	public void setAjustaParcelaCEF(AjustaParcelaCEF ajustaParcelaCEF) {
		this.ajustaParcelaCEF = ajustaParcelaCEF;
	}

	public ParcelaFinancimentoCEF getParcelaFinancimentoCEFSelecionada() {
		return parcelaFinancimentoCEFSelecionada;
	}

	public void setParcelaFinancimentoCEFSelecionada(
			ParcelaFinancimentoCEF parcelaFinancimentoCEFSelecionada) {
		this.parcelaFinancimentoCEFSelecionada = parcelaFinancimentoCEFSelecionada;
	}

	public List<ParcelaFinancimentoCEF> getParcelasFinancimentoCEF() {
		return parcelasFinancimentoCEF;
	}

	public void setParcelasFinancimentoCEF(
			List<ParcelaFinancimentoCEF> parcelasFinancimentoCEF) {
		this.parcelasFinancimentoCEF = parcelasFinancimentoCEF;
	}

	public QuitaParcelaCEF getQuitaParcelaCEF() {
		return quitaParcelaCEF;
	}

	public void setQuitaParcelaCEF(QuitaParcelaCEF quitaParcelaCEF) {
		this.quitaParcelaCEF = quitaParcelaCEF;
	}


}
